Skip to content

GitLAB&Jenkins

GitLAB &Jenkins

image-20230423061727812

目录

[toc]

实践:基于Jenkins提交流水线(测试成功)-2023.4.25

目的:掌握通过触发器将GitLab和Jenkins集成,实现提交流水线。

image-20220514100956964

image-20220512070753368

1、触发Jenkins构建

安装Generic Webhook Trigger插件

tstmp_20230423061901

重启后,进入一个Pipeline项目设置,已经可以选择这个触发器了....

tstmp_20230423061918

插件文档https:--header 'Authorization:Basic YWRtaW46YWRtaW4='

image-20230423064006576

image-20230423064023234

可以看到,也是能构建成功的。

解析GET/POST请求数据

传参注意,第一个参数使用?号连接, 后面的参数使用&符号连接。

bash
?token=demo-pipeline-service&user=jenkins&a=1&b=2

解析GET数据

  • 客户端发送Get请求, 带有两个参数 versionusername
bash
http:println("${version}")println("${username}")pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'}}}}

再次postman触发,观察效果:(符合预期)

image-20230423070111659

image-20230423070131842

解析HEADER参数数据

  • 客户端发送请求(什么请求都可以,这里的header与请求类型无关), 带有两个参数 devops和 tool-name。

image-20230423073947672

  • Jenkins 配置Generic hook,获取请求参数devops和 tool-name 。

image-20230423073742460

  • 通过jenkinsfile读取传递的参数

注意,这里的pipeline代码如果打印tool-name变量的话,会报错的

image-20230423074147969

image-20230423074130589

这里要使用下划线来替换横杠:

image-20230423074348398

image-20230423074251891

再次触发,就正常了,符合预期。

image-20230423074331148

解析POST数据

  • 客户端发送POST请求, 参数存储在body体中(参考POSTMAN中的样例

image-20230423075425757

  • Jenkins 配置触发器来获取Post参数。

删除之前测试的header参数,request参数。

$代表/,获取所有数据

image-20230423075557421

获取name字段

image-20230423075615899

  • Jenkinsfile中使用参数

image-20230423075714076

触发:

image-20230423075743209

验证:

image-20230423075810592

image-20230423075832618

扩展流水线解析JSON数据

  • 安装插件: Pipeline Utility Steps

image-20230423121825709

  • readJSON: 处理json数据
groovy
currentBuild.displayName ="${name}"println("${Data}")NewData=readJSON text:"${Data}"envName =NewData["envName"]appsName =NewData["apps"]["name"]pipeline {agent anystages {stage('Hello') {steps {script {println("${envName}")println("${appsName}")}}}}}

再次构建:

验证:(符合预期)

image-20230423123103473

image-20230423122848208

Rebuilder插件使用

可以直接携带原触发参数进行触发,不用重复触发(不用在重复的提交代码了)

tstmp_20230423071021

进入某一次构建后,可以点击rebuild。

tstmp_20230423071045

2、获取触发参数

1.触发器配置

Jenkins开启trigger

目的: 开启trigger后,就可以实现其他系统通过一个指定的URL进行自动触发构建了;

新建一个文件夹存放对应GitLab仓库组中的流水线。这里建议用仓库组的名称作为文件夹的名称devops03;

用Gitlab项目名称与流水线命名; devops03-demo-service项目;

tstmp_20230423210432

tstmp_20230423210444

  • 开启Generic webhook;
  • 配置触发Token,例如:作业名称devops03-demo-service(这个token是流水线触发需要传递的);
  • 生成的触发URL;

tstmp_20230423210537

bash
http:NewData=readJSON text:"${Data}"println("${NewData}")pipeline {agent anystages {stage('Hello') {steps {script {println("${NewData}")}}}}}

配置GitLab WebHook

进入GitLab项目设置, 进入 webhook配置页面;

  • 配置要触发的URL,即Jenkins触发器接口URL;

  • 选择发生哪种GitLab事件后触发此Webhook;例如:Push提交代码、Tag创建标签等等;

  • 在gitlab的项目里配置好webhook

http:NewData=readJSON text:"${Data}"println("${NewData}")srcUrl =NewData["project"]["git_http_url"]branchName =NewData["ref"] -"refs/heads/"currentBuild.displayName ="${branchName}"currentBuild.description ="src:${srcUrl}"pipeline {agent anystages {stage('CheckOut') {steps {script {println("Checkout:${srcUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${srcUrl}"]]])sh 'ls -l'}}}}}

image-20230424062941803

将写好的代码保存到jekins里。

  • 在gitlab任意分支做个提交:

我们先拉取下代码:

image-20230424062044964

feature-dev-01编辑README.md文件并推送。

bash
Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$catREADME.md情出自愿-事过无悔Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$echo>>README.mdWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitadd.warning:intheworkingcopyof'README.md',LFwillbereplacedbyCRLFthenexttimeGittouchesitWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitcommit-m"佳"[feature-dev-01 683b378] 佳1filechanged,1insertion(+)Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitpushoriginfeature-dev-01Enumeratingobjects:5,done.Countingobjects:100%(5/5),done.Deltacompressionusingupto8threadsCompressingobjects:100%(2/2),done.Writingobjects:100%(3/3),287 bytes |287.00KiB/s,done.Total3(delta 1),reused 0 (delta0),pack-reused 0remote:remote:Tocreateamergerequestforfeature-dev-01,visit:remote:http:remote:Tohttp:7cf5639..683b378feature-dev-01->feature-dev-01Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$
  • 此时可以看到jenkins里的流水线被触发了

image-20230424063019832

image-20230424063039348

  • 这里再在新建一个分支,用于测试,看是否会触发jebnkins流水线
bash
Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-dev-01)$gitcheckout-bfeature-003Switchedtoanewbranch'feature-003'Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$lsHELP.mdREADME.mdmvnw*mvnw.cmdpom.xmlsrc/Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$echo"i am very hurt">README.mdWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$gitadd.warning:intheworkingcopyof'README.md',LFwillbereplacedbyCRLFthenexttimeGittouchesitWin@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$gitcommit-m"hurt"[feature-003 1de466b] hurt1filechanged,1insertion(+),2deletions(-)Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$gitpushoriginfeature-003Enumeratingobjects:5,done.Countingobjects:100%(5/5),done.Deltacompressionusingupto8threadsCompressingobjects:100%(2/2),done.Writingobjects:100%(3/3),262 bytes |262.00KiB/s,done.Total3(delta 1),reused 0 (delta0),pack-reused 0remote:remote:Tocreateamergerequestforfeature-003,visit:remote:http:remote:Tohttp:*[new branch]feature-003->feature-003Win@DESKTOP-VUMV922MINGW64~/Desktop/demo(feature-003)$

可以看到,jenkins流水线被触发了。

image-20230424063343728

image-20230424063427563

🍀 之前代码

tstmp_20230424073517

groovy
webhookData =readJSON text:"${webhook_data}"env.branchName =webhookData["ref"] -"refs/heads/"env.projectUrl =webhookData["project"]["git_http_url"]env.userEmail =webhookData["user_email"]currentBuild.description ="BranchName:${env.branchName}"currentBuild.displayName ="${env.branchName}"pipeline {agent {label "build01"}stages {stage('Checkout') {steps {script{checkout([$class:'GitSCM',branches:[[name:"${env.branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'d7e4e500-e5c6-4673-ae4b-d43bf4ff5d19',url:"${env.projectUrl}"]]])}}}stage('Build'){steps{script{sh "mvn clean package -DskipTests"}}}stage('test'){steps{script{sh "mvn test"}}}}post {always{script{EmailUser("${env.userEmail}",currentBuild.currentResult)}}}}defEmailUser(userEmail,status){emailext body:"""<!DOCTYPE html><html><head><meta charset="UTF-8"></head> <body leftmargin="8"marginwidth="0"topmargin="8"marginheight="4"offset="0"><img src="http:<table width="95%"cellpadding="0"cellspacing="0"style="font-size:11pt;font-family:Tahoma,Arial,Helvetica,sans-serif"><tr><td><br /><b><font color="#0B610B">构建信息</font></b></td> </tr> <tr><td><ul><li>项目名称:${JOB_NAME}</li>         <li>构建编号:${BUILD_ID}</li> <li>构建状态:${status} </li>                         <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li><li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li></ul> </td> </tr> <tr></table> </body> </html>  """,subject:"Jenkins-${JOB_NAME}项目构建信息 ",to:userEmail}
  • 进一步更新代码

此时,想要commitId的前8位该如何取呢?

这样处理就好:

image-20230425154819839

groovy
println("${Data}")NewData=readJSON text:"${Data}"println("${NewData}")srcUrl =NewData["project"]["git_http_url"]branchName =NewData["ref"] -"refs/heads/"env.commitId =NewData["checkout_sha"][0..7]currentBuild.displayName ="${branchName}:${env.commitId}"currentBuild.description ="src:${srcUrl}"pipeline {agent anystages {stage('CheckOut') {steps {script {println("Checkout:${srcUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${srcUrl}"]]])sh 'ls -l'}}}}}

触发测试:(符合预期)

image-20230425154646725

4、手动触发流水线

很简单的,就是在jenkins项目里添加一些选项参数,把这些变量写死在选项参数里就好。

自动触发和手动触发的可以并存的,例如写一些If ……else,但是不推荐。

手动触发:例如有一些版本分支,这些分支名是会变的,因此不是很方便;但是如果不想每次提交都触发流水线,而是等到一个小版本后再触发,这个用手动触发也是可以的哦。

tstmp_20230424073934

groovy
currentBuild.description ="BranchName:${env.branchName}"currentBuild.displayName ="${env.branchName}"pipeline {agent {label "build01"}stages {stage('Checkout') {steps {script{checkout([$class:'GitSCM',branches:[[name:"${env.branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'d7e4e500-e5c6-4673-ae4b-d43bf4ff5d19',url:"${env.projectUrl}"]]])}}}stage('Build'){steps{script{sh "mvn clean package -DskipTests"}}}stage('test'){steps{script{sh "mvn test"}}}}}

这里做下测试:

  • jenkins上创建项目gitlab-jenkins-service-manual,配置好选项参数。

image-20230425065842085

image-20230425065859778

  • 编写pipeline代码
groovy
currentBuild.description ="BranchName:${env.branchName}"currentBuild.displayName ="${env.branchName}"pipeline {agent {label "build01"}stages {stage('CheckOut') {steps {script {println("Checkout:${projectUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${projectUrl}"]]])sh 'ls -l'}}} stage('Build'){steps{script{println("mvn clean package -DskipTests") }}}stage('test'){steps{script{println("mvn test")}}}}}

image-20230425065947246

  • 准备好一个gitlab项目就好。

image-20230425070037754

  • 测试(符合预期)

image-20230425070134247

image-20230425065814820

5、Jenkins消息通知

添加邮箱

邮箱是标配吧。(钉钉机器人也是可以的)

  • 默认情况可能每个Gitlab用户没有配置邮箱的, 需要Gitlab用户要配置好邮箱。

image-20230424123744541

  • 点击头像进入 edit profile

tstmp_20230424123355

添加自己邮箱:

image-20230424123532445

这里需要登录到自己的邮箱去确认下:

方法1:或者按如下方式直接配置好自己的gitlab邮箱为qq邮箱:(强制更改本次是强制更改的。

image-20230424204730808

点击Edit

image-20230424204803668

这里配置好自己的邮箱,点击保存:

image-20230424204854790

可以看到这里的邮箱被确认了:

image-20230424205009192

方法2:在自己的邮箱里确认。

  • 奇怪,我这里怎么163、qq邮箱都收不到确认邮件呢??😥

image-20220512222617386

  • 经过百度,发现是在gitlab里的配置文件要做下配置的:
bash
[root@devops ~]#docker psCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES11a54a1f4a2agitlab/gitlab-ce:14.9.3-ce.0"/assets/wrapper"6daysagoUp28hours(healthy) 0.0.0.0:80->80/tcp,0.0.0.0:443->443/tcp,0.0.0.0:2222->22/tcp devops_tutorial_gitlabf3f039aa667ajenkins/jenkins:2.332.2-centos7-jdk8"/sbin/tini -- /usr/…"4weeksagoUp24hours0.0.0.0:8080->8080/tcp,:::8080->8080/tcp,0.0.0.0:50000->50000/tcp,:::50000->50000/tcpjenkins[root@devops ~]#docker exec -it devops_tutorial_gitlab bashroot@11a54a1f4a2a:/#vi/etc/gitlab/gitlab.rb#搜索smtpgitlab_rails['smtp_enable']=truegitlab_rails['smtp_address']="smtp.163.com"gitlab_rails['smtp_port']=465gitlab_rails['smtp_user_name']="onexlforyou@163.com"gitlab_rails['smtp_password']="NVSMOUfffAxxxccEMXAB"gitlab_rails['smtp_domain']="163.com"gitlab_rails['smtp_authentication']="login"gitlab_rails['smtp_enable_starttls_auto']=truegitlab_rails['smtp_tls']=truegitlab_rails['gitlab_email_from']='onexlforyou@163.com'root@11a54a1f4a2a:/#gitlab-ctlreconfigure

image-20220512230631903

image-20220512232120119

image-20220512231434198

  • 此时,发下就可以正常识别到自己的邮箱了:

image-20220512231704671

image-20220512231531784

image-20220512231618636

  • 参考链接:

http:defEmailUser(userEmail,status){emailext body:"""<!DOCTYPE html><html><head><meta charset="UTF-8"></head> <body leftmargin="8"marginwidth="0"topmargin="8"marginheight="4"offset="0"><img src="http:<table width="95%"cellpadding="0"cellspacing="0"style="font-size:11pt;font-family:Tahoma,Arial,Helvetica,sans-serif"><tr><td><br /><b><font color="#0B610B">构建信息</font></b></td> </tr> <tr><td><ul><li>项目名称:${JOB_NAME}</li> <li>构建编号:${BUILD_ID}</li> <li>构建状态:${status} </li> <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li><li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li></ul> </td> </tr> <tr></table> </body> </html> """,subject:"Jenkins-${JOB_NAME}项目构建信息 ",to:userEmail}

image-20230424212344209

groovy
println("${Data}")NewData=readJSON text:"${Data}"println("${NewData}")srcUrl =NewData["project"]["git_http_url"]branchName =NewData["ref"] -"refs/heads/"userEmail =NewData["user_email"]currentBuild.displayName ="${branchName}"currentBuild.description ="src:${srcUrl}"pipeline {agent anystages {stage('CheckOut') {steps {script {println("Checkout:${srcUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${srcUrl}"]]])sh 'ls -l'}}}}post {always{script{EmailUser(userEmail,"${currentBuild.currentResult}")}}}}defEmailUser(userEmail,status){emailext body:"""<!DOCTYPE html><html><head><meta charset="UTF-8"></head> <body leftmargin="8"marginwidth="0"topmargin="8"marginheight="4"offset="0"><img src="http:<table width="95%"cellpadding="0"cellspacing="0"style="font-size:11pt;font-family:Tahoma,Arial,Helvetica,sans-serif"><tr><td><br /><b><font color="#0B610B">构建信息</font></b></td> </tr> <tr><td><ul><li>项目名称:${JOB_NAME}</li>         <li>构建编号:${BUILD_ID}</li> <li>构建状态:${status} </li>                         <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li><li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li></ul> </td> </tr> <tr></table> </body> </html>  """,subject:"Jenkins-${JOB_NAME}项目构建信息 ",to:userEmail}

image-20230424220307725

image-20230424220258311

image-20230424220237905

触发测试

  • 提交下代码,触发下

image-20230424212630637

  • 自己的测试现象(符合预期)

image-20230424214039852

image-20230424214104233

image-20230424214122673

解决默认图片显示异常问题

  • 可以看到这里的人图片显示异常,这里我们使用oss路径来存储图片就可以了。

image-20230424220342128

image-20230425161711144

本次最新代码(测试成功)

groovy
println("${Data}")NewData=readJSON text:"${Data}"println("${NewData}")srcUrl =NewData["project"]["git_http_url"]branchName =NewData["ref"] -"refs/heads/"userEmail =NewData["user_email"]env.commitId =NewData["checkout_sha"][0..7]env.commitUser =NewData["user_username"] currentBuild.displayName ="${branchName}:${env.commitId}"currentBuild.description ="src:${srcUrl}"pipeline {agent anystages {stage('CheckOut') {steps {script {println("Checkout:${srcUrl} ${branchName}")checkout([$class:'GitSCM',branches:[[name:"${branchName}"]],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:"${srcUrl}"]]])sh 'ls -l'}}}stage("Build"){steps{script{echo "build"}}}stage("UnitTest"){steps{script{echo "unit test"}}}stage("deploy"){steps {script{echo "deploy"}}}}post {always{script{EmailUser(userEmail,"${currentBuild.currentResult}")}}}}defEmailUser(userEmail,status){emailext body:"""<!DOCTYPE html><html><head><meta charset="UTF-8"></head> <body leftmargin="8"marginwidth="0"topmargin="8"marginheight="4"offset="0"><img src="https:<table width="95%"cellpadding="0"cellspacing="0"style="font-size:11pt;font-family:Tahoma,Arial,Helvetica,sans-serif"><tr><td><br /><b><font color="#0B610B">构建信息</font></b></td> </tr> <tr><td><ul><li>项目名称:${JOB_NAME}</li>         <li>构建编号:${BUILD_ID}</li> <li>构建状态:${status} </li>                         <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li><li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li></ul> </td> </tr> <tr></table> </body> </html>  """,subject:"Jenkins-${JOB_NAME}项目构建信息 ",to:userEmail}

FAQ

扩展:jenkins webhook插件也是支持写到代码里的

这个jenkins webhook插件也是支持写到代码里的,不然项目一多的话,在这里改也是很麻烦的……。

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 语雀

https:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新